#include <unistd.h>
#include <wait.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>

int tokenize_it(char *, char **);
int cd(char *);

using namespace std;

int main(int argc, char** argv)
{
        char cmd_buffer[512],*tokens[20];
        int pid,status,is_bg=0,i;
        char newline_off;

        while(cout << ": ",cin.get(cmd_buffer,512))

                    //prompt ausgeben und Kommando lesen
        {
                cin.get(newline_off);

                     //newline aus Puffer
                if(!*cmd_buffer) //nichts eingegeben?
                        continue;
                        
                if(cmd_buffer[i=strlen(cmd_buffer)-1] =='&')

                    //Kommando im Hintergrund ausführen?
                {
                        cmd_buffer[i]=0;
                        is_bg = 1;
                }
                        
                else
                        is_bg = 0;
                
                tokenize_it(cmd_buffer,tokens);

                     // Kommando in syntaktische Teile zerpflücken

                if(!strcmp(*tokens,"cd"))                    
                        cd(*(tokens+1));

                else if(!strcmp(*tokens,"exit"))                    
                        return 0;

                        // interne Kommandos ?

                else
                        if(!(pid = fork()))

                         //Kindsprozeß erzeugen
                        {
                                if(execvp(*tokens,tokens)==-1)
                                        return 1;
                        }
                        else
                        {
                                if(!is_bg)
                                        while(wait(&status)!=pid);

                        //auf das Ende warten
                                else
                                        cout << "....started with " << pid << endl;
                        }
        }
}

int tokenize_it(char *cmd, char **tab)
{
        while(*tab++=strtok(cmd," \t"))
                //liefert Zeiger auf tokens
                cmd=0;
}

int cd(char *path)
{
        if(path == 0)
                return chdir(getenv("HOME"));  
        return chdir(path);
}